#ifndef __INKLUDE_FUNCTION_PARALLEL_INVOKE_H__
#define __INKLUDE_FUNCTION_PARALLEL_INVOKE_H__

#include <Inklude/Inklude.h>
#include <functional>
#include <vector>
#include <memory>

namespace Inklude
{
    typedef std::function<void()> voidFunc;
    typedef std::shared_ptr<voidFunc> voidFuncPtr;

    INKLUDE_FUNC_EXPORT void ParallelInvoke(voidFunc& func0, voidFunc& func1);
    INKLUDE_FUNC_EXPORT void ParallelInvoke(voidFunc& func0, voidFunc& func1, voidFunc& func2);
    INKLUDE_FUNC_EXPORT void ParallelInvoke(voidFunc& func0, voidFunc& func1, voidFunc& func2, voidFunc& func3);
    INKLUDE_FUNC_EXPORT void ParallelInvoke(voidFunc& func0, voidFunc& func1, voidFunc& func2, voidFunc& func3, voidFunc& func4);
    INKLUDE_FUNC_EXPORT void ParallelInvoke(voidFunc& func0, voidFunc& func1, voidFunc& func2, voidFunc& func3, voidFunc& func4, voidFunc& func5);
    INKLUDE_FUNC_EXPORT void ParallelInvoke(voidFunc& func0, voidFunc& func1, voidFunc& func2, voidFunc& func3, voidFunc& func4, voidFunc& func5, voidFunc& func6);
    INKLUDE_FUNC_EXPORT void ParallelInvoke(voidFunc& func0, voidFunc& func1, voidFunc& func2, voidFunc& func3, voidFunc& func4, voidFunc& func5, voidFunc& func6, voidFunc& func7);
    INKLUDE_FUNC_EXPORT void ParallelInvoke(voidFunc& func0, voidFunc& func1, voidFunc& func2, voidFunc& func3, voidFunc& func4, voidFunc& func5, voidFunc& func6, voidFunc& func7, voidFunc& func8);
    INKLUDE_FUNC_EXPORT void ParallelInvoke(voidFunc& func0, voidFunc& func1, voidFunc& func2, voidFunc& func3, voidFunc& func4, voidFunc& func5, voidFunc& func6, voidFunc& func7, voidFunc& func8, voidFunc& func9);

    INKLUDE_FUNC_EXPORT void ParallelInvoke(std::vector<voidFuncPtr>& funcVec);

    INKLUDE_FUNC_EXPORT void ParallelInvoke(std::vector<voidFunc>& funcVec);
    void __internal_parallel_invoke(std::vector<voidFunc>& funcVec, size_t startIndex, size_t vecSize);
}

#endif // __INKLUDE_FUNCTION_PARALLEL_INVOKE_H__

